package com.example.myapplication;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.Editable;
import android.text.InputType;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import android.app.ProgressDialog;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "登录页";
    private static final String PREF_NAME = "user_info";

    // 原有控件（不变）
    private EditText etUsername; // 注意：现在实际用它输入email（Reqres接口要求）
    private EditText etPassword;
    private CheckBox cbRememberMe;
    private CheckBox cbAutoLogin;
    private Button btnLogin;
    private Button btnRegister;
    private ImageView ivTogglePassword;
    private boolean isPasswordVisible = false;
    private SharedPreferences sharedPreferences;
    private ProgressDialog progressDialog; // 加载提示框

    // 新增：ViewModel实例（MVVM核心，通过ViewModelProvider获取）
    private LoginViewModel loginViewModel;

    // 新增：主线程工具（供HttpUtil回调使用）
    public static void runOnMainThread(Runnable runnable) {
        if (Looper.getMainLooper() == Looper.myLooper()) {
            runnable.run();
        } else {
            new Handler(Looper.getMainLooper()).post(runnable);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate：我创建了");
        setContentView(R.layout.activity_main);

        // 初始化基础组件
        sharedPreferences = getSharedPreferences(PREF_NAME, MODE_PRIVATE);
        progressDialog = new ProgressDialog(this);
        progressDialog.setCancelable(false); // 加载时不允许取消
        initViews();
        loadSavedUserInfo();

        // 关键：初始化ViewModel（MVVM核心）
        loginViewModel = new ViewModelProvider(this).get(LoginViewModel.class);

        // 观察ViewModel的状态（登录/注册/自动登录）
        observeViewModelStates();

        // 检查是否需要自动登录
        checkAutoLogin();

        // 原有监听（不变）
        setupAllListeners();
    }

    // 新增：观察ViewModel的状态，更新UI
    private void observeViewModelStates() {
        // 1. 观察登录状态
        loginViewModel.getLoginState().observe(this, new Observer<LoginViewModel.UiState>() {
            @Override
            public void onChanged(LoginViewModel.UiState uiState) {
                switch (uiState.state) {
                    case LOADING:
                        // 加载中：显示提示框
                        progressDialog.setMessage(uiState.message);
                        progressDialog.show();
                        break;
                    case SUCCESS:
                        // 登录成功：关闭提示框，保存信息，跳转首页
                        progressDialog.dismiss();
                        Toast.makeText(MainActivity.this, uiState.message, Toast.LENGTH_SHORT).show();
                        // 保存用户信息（email、password、token、自动登录状态）
                        saveUserInfo(
                                etUsername.getText().toString().trim(),
                                etPassword.getText().toString().trim(),
                                uiState.token, // 保存登录成功的token（用于自动登录）
                                cbRememberMe.isChecked(),
                                cbAutoLogin.isChecked()
                        );
                        // 跳转首页
                        jumpToHome(etUsername.getText().toString().trim());
                        break;
                    case FAILURE:
                        // 登录失败：关闭提示框，显示错误信息
                        progressDialog.dismiss();
                        Toast.makeText(MainActivity.this, uiState.message, Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        });

        // 2. 观察注册状态（逻辑和登录类似）
        loginViewModel.getRegisterState().observe(this, new Observer<LoginViewModel.UiState>() {
            @Override
            public void onChanged(LoginViewModel.UiState uiState) {
                switch (uiState.state) {
                    case LOADING:
                        progressDialog.setMessage(uiState.message);
                        progressDialog.show();
                        break;
                    case SUCCESS:
                        progressDialog.dismiss();
                        Toast.makeText(MainActivity.this, uiState.message, Toast.LENGTH_SHORT).show();
                        // 注册成功直接保存信息并跳转首页
                        saveUserInfo(
                                etUsername.getText().toString().trim(),
                                etPassword.getText().toString().trim(),
                                uiState.token,
                                true, // 注册成功默认记住信息
                                false // 注册成功不默认自动登录（用户可手动勾选）
                        );
                        jumpToHome(etUsername.getText().toString().trim());
                        break;
                    case FAILURE:
                        progressDialog.dismiss();
                        Toast.makeText(MainActivity.this, uiState.message, Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        });

        // 3. 观察自动登录状态
        loginViewModel.getAutoLoginState().observe(this, new Observer<LoginViewModel.UiState>() {
            @Override
            public void onChanged(LoginViewModel.UiState uiState) {
                switch (uiState.state) {
                    case LOADING:
                        Toast.makeText(MainActivity.this, uiState.message, Toast.LENGTH_SHORT).show();
                        break;
                    case SUCCESS:
                        // 自动登录成功：跳转首页
                        String email = sharedPreferences.getString("email", "");
                        jumpToHome(email);
                        break;
                    case FAILURE:
                        // 自动登录失败：显示错误，停在登录页
                        Toast.makeText(MainActivity.this, uiState.message, Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        });
    }

    // 原有方法：初始化控件（不变）
    private void initViews() {
        etUsername = findViewById(R.id.et_username);
        etPassword = findViewById(R.id.et_password);
        cbRememberMe = findViewById(R.id.cb_remember_me);
        cbAutoLogin = findViewById(R.id.cb_auto_login);
        btnLogin = findViewById(R.id.btn_login);
        btnRegister = findViewById(R.id.btn_register);
        ivTogglePassword = findViewById(R.id.iv_toggle_password);
        // 优化：修改输入框提示（因为现在用username输入框填email）
        etUsername.setHint("请输入邮箱");
    }

    // 原有方法：设置监听（只修改登录和注册按钮的逻辑）
    private void setupAllListeners() {
        // 1. 用户名输入框监听（不变）
        etUsername.setOnFocusChangeListener((v, hasFocus) -> {
            etUsername.setBackgroundResource(hasFocus ? R.drawable.edittext_border_focused : R.drawable.edittext_border);
        });
        etUsername.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {}
            @Override
            public void afterTextChanged(Editable s) {
                etUsername.setSelection(s.length());
                updateLoginButtonState();
            }
        });

        // 2. 密码输入框监听（不变）
        etPassword.setOnFocusChangeListener((v, hasFocus) -> {
            etPassword.setBackgroundResource(hasFocus ? R.drawable.edittext_border_focused : R.drawable.edittext_border);
        });
        etPassword.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {}
            @Override
            public void afterTextChanged(Editable s) { updateLoginButtonState(); }
        });

        // 3. 记住密码/自动登录复选框（不变）
        cbRememberMe.setOnCheckedChangeListener((buttonView, isChecked) -> {
            if (!isChecked) cbAutoLogin.setChecked(false);
            updateLoginButtonState();
        });
        cbAutoLogin.setOnCheckedChangeListener((buttonView, isChecked) -> {
            if (isChecked && !cbRememberMe.isChecked()) cbRememberMe.setChecked(true);
        });

        // 4. 密码可见性切换（不变）
        ivTogglePassword.setOnClickListener(v -> togglePasswordVisibility());

        // 【修改】5. 登录按钮：调用ViewModel的login方法（替换原有模拟逻辑）
        btnLogin.setOnClickListener(v -> {
            String email = etUsername.getText().toString().trim();
            String password = etPassword.getText().toString().trim();
            if (validateInput(email, password)) { // 输入验证（不变）
                loginViewModel.login(email, password); // 调用ViewModel登录
            }
        });

        // 【修改】6. 注册按钮：调用ViewModel的register方法（替换原有模拟逻辑）
        btnRegister.setOnClickListener(v -> {
            String email = etUsername.getText().toString().trim();
            String password = etPassword.getText().toString().trim();
            if (validateInput(email, password)) {
                loginViewModel.register(email, password); // 调用ViewModel注册
            }
        });

        updateLoginButtonState();
    }

    // 原有方法：密码可见性切换（不变）
    private void togglePasswordVisibility() {
        isPasswordVisible = !isPasswordVisible;
        int inputType = isPasswordVisible
                ? (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD)
                : (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
        etPassword.setInputType(inputType);
        ivTogglePassword.setImageResource(isPasswordVisible ? R.drawable.ic_visibility : R.drawable.ic_visibility_off);
        etPassword.setSelection(etPassword.getText().length());
    }

    // 【修改】输入验证：增加邮箱格式简单校验（因为Reqres需要正确邮箱）
    private boolean validateInput(String email, String password) {
        if (TextUtils.isEmpty(email)) {
            Toast.makeText(this, "请输入邮箱", Toast.LENGTH_SHORT).show();
            return false;
        }
        // 简单邮箱格式校验（包含@和.）
        if (!email.contains("@") || !email.contains(".")) {
            Toast.makeText(this, "请输入正确的邮箱格式（如xxx@xxx.com）", Toast.LENGTH_SHORT).show();
            return false;
        }
        if (TextUtils.isEmpty(password)) {
            Toast.makeText(this, "请输入密码", Toast.LENGTH_SHORT).show();
            return false;
        }
        if (password.length() < 6) {
            Toast.makeText(this, "密码长度不能少于6位", Toast.LENGTH_SHORT).show();
            return false;
        }
        return true;
    }

    // 原有方法：更新登录按钮状态（不变）
    private void updateLoginButtonState() {
        boolean isEnabled = !TextUtils.isEmpty(etUsername.getText().toString().trim())
                && !TextUtils.isEmpty(etPassword.getText().toString().trim())
                && cbRememberMe.isChecked();
        btnLogin.setEnabled(isEnabled);
        btnLogin.setBackgroundTintList(getResources().getColorStateList(
                isEnabled ? android.R.color.holo_blue_light : android.R.color.darker_gray
        ));
    }

    // 【修改】保存用户信息：增加token保存（用于自动登录）
    private void saveUserInfo(String email, String password, String token, boolean remember, boolean autoLogin) {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("email", remember ? email : ""); // 保存邮箱（原username）
        editor.putString("password", remember ? password : "");
        editor.putString("token", remember ? token : ""); // 保存token（自动登录用）
        editor.putBoolean("remember_me", remember);
        editor.putBoolean("auto_login", autoLogin);
        editor.apply();
    }

    // 【修改】加载保存的用户信息：加载邮箱和token（原username改为email）
    private void loadSavedUserInfo() {
        etUsername.setText(sharedPreferences.getString("email", "")); // 显示邮箱
        etPassword.setText(sharedPreferences.getString("password", ""));
        cbRememberMe.setChecked(sharedPreferences.getBoolean("remember_me", false));
        cbAutoLogin.setChecked(sharedPreferences.getBoolean("auto_login", false));
    }

    // 【修改】自动登录：调用ViewModel的autoLogin方法（替换原有模拟逻辑）
    private void checkAutoLogin() {
        boolean isAutoLogin = sharedPreferences.getBoolean("auto_login", false);
        boolean isRemember = sharedPreferences.getBoolean("remember_me", false);
        String token = sharedPreferences.getString("token", ""); // 获取保存的token

        // 满足条件：勾选自动登录+记住信息+有token
        if (isAutoLogin && isRemember && !TextUtils.isEmpty(token)) {
            loginViewModel.autoLogin(token); // 调用ViewModel自动登录
        }
    }

    // 新增：跳转首页（统一封装）
    private void jumpToHome(String username) {
        Intent intent = new Intent(MainActivity.this, HomeActivity.class);
        intent.putExtra("username", username);
        startActivity(intent);
        finish(); // 关闭登录页，避免返回
    }

    // 原有生命周期日志（不变）
    @Override
    protected void onStart() { super.onStart(); Log.d(TAG, "onStart：我可见了"); }
    @Override
    protected void onResume() { super.onResume(); Log.d(TAG, "onResume：碰碰我看看能发生什么？"); }
    @Override
    protected void onPause() { super.onPause(); Log.d(TAG, "onPause：别碰我了，没反应"); }
    @Override
    protected void onStop() { super.onStop(); Log.d(TAG, "onStop：躲猫猫躲猫猫哦"); }
    @Override
    protected void onRestart() { super.onRestart(); Log.d(TAG, "onRestart：我灰太狼又回来啦！"); }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 销毁时关闭提示框（防止内存泄漏）
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
        Log.d(TAG, "onDestroy：俺死了");
    }
}